/**
 *
 */

{
  /**
   * 一个新需求，获取传入参数的长度，已知参数的数组或者字符串
   *  这样写其实本质上相当于 arg的类型是 type T{}
   *    T里面并没有length 属性  所以我们 使用 arg.length 会报错
   *
   *  基于这种情况，我们就要使用 extends 继承 继承了字符串和数组类型 那么这个T上就有了length属性（因为字符串和数组都有length属性）
   */
  function getLength1<T>(arg: T): number {
    // return arg.length; 会报错 类型“T”上不存在属性“length”。
    return 0;
  }

  /**
   * 这个例子中T继承了 字符串和 any[]数组类型 这时候的T就有了length属性
   *  就有了完美的类型支持
   */
  function getLength<T extends string | any[]>(arg: T): number {
    return arg.length;
  }
}
